package com.bookrecomm.controller;

import com.bookrecomm.entity.Tag;
import com.bookrecomm.service.TagService;
import com.bookrecomm.vo.ResultVO;
import com.bookrecomm.vo.TagVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 标签控制器
 * 处理图书标签相关的请求
 */
@RestController
@RequestMapping("/tags")
public class TagController {

    @Autowired
    private TagService tagService;

    /**
     * 获取所有标签列表
     * @return 标签列表
     */
    @GetMapping
    public ResultVO<List<TagVO>> getAllTags() {
        List<TagVO> tags = tagService.findAll();
        return ResultVO.success("获取成功", tags);
    }

    /**
     * 获取热门标签列表
     * @param limit 限制数量
     * @return 热门标签列表
     */
    @GetMapping("/hot")
    public ResultVO<List<TagVO>> getHotTags(@RequestParam(defaultValue = "10") int limit) {
        List<TagVO> tags = tagService.findHotTags(limit);
        return ResultVO.success("获取成功", tags);
    }

    /**
     * 根据ID查询标签
     * @param id 标签ID
     * @return 标签信息
     */
    @GetMapping("/{id}")
    public ResultVO<TagVO> getTagById(@PathVariable Long id) {
        TagVO tag = tagService.findById(id);
        return ResultVO.success("获取成功", tag);
    }

    /**
     * 添加标签（仅管理员可操作）
     * @param tag 标签信息
     * @return 添加后的标签信息
     */
    @PostMapping
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<TagVO> addTag(@Valid @RequestBody Tag tag) {
        TagVO tagVO = tagService.addTag(tag);
        return ResultVO.success("添加成功", tagVO);
    }

    /**
     * 更新标签（仅管理员可操作）
     * @param id 标签ID
     * @param tag 标签信息
     * @return 更新后的标签信息
     */
    @PutMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<TagVO> updateTag(
            @PathVariable Long id,
            @Valid @RequestBody Tag tag) {
        
        TagVO tagVO = tagService.updateTag(id, tag);
        return ResultVO.success("更新成功", tagVO);
    }

    /**
     * 删除标签（仅管理员可操作）
     * @param id 标签ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResultVO<Boolean> deleteTag(@PathVariable Long id) {
        boolean success = tagService.deleteTag(id);
        return ResultVO.success("删除成功", success);
    }

    /**
     * 增加标签热度
     * @param id 标签ID
     * @param increment 增量
     * @return 更新后的标签信息
     */
    @PutMapping("/{id}/heat")
    public ResultVO<TagVO> incrementHeat(
            @PathVariable Long id,
            @RequestParam(defaultValue = "1") Integer increment) {
        
        TagVO tagVO = tagService.incrementHeat(id, increment);
        return ResultVO.success("更新成功", tagVO);
    }
}
